import axios from 'axios'
import { Message, LoadingBar } from 'iview'
import { getToken } from '@/libs/util'
import store from '../store/'

// baseURL, 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL.
if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL = ''
} else if (process.env.NODE_ENV === 'debug') {
  axios.defaults.baseURL = ''
} else if (process.env.NODE_ENV === 'production') {
  axios.defaults.baseURL = ''
}

let cancel, promiseArr = {}
// const CancelToken = axios.CancelToken;

function cleanRequest (req) {
  for (const i in req) {
    /* eslint guard-for-in: 0 */
    if (req[i] !== 0 && !req[i]) {
      delete req[i]
    }
  }
}

// 创建axios实例
const service = axios.create({
  timeout: 30000 // 请求超时时间
  // cancelToken: new CancelToken(cancel => {  //强行中断请求要用到的
  //     console.log('hello', cancel)
  //     _httpCancel = cancel;
  // })
})

// axios.defaults.headers.post['Content-Type'] = 'application/json';

let pending = [] // 声明一个数组用于存储每个请求的取消函数和axios标识，在项目中会遇到重复请求的问题，例如重复点击问题， 
let cancelToken = axios.CancelToken
let removePending = (config) => {
  for (let i in pending) {
    if (pending[i].url === axios.defaults.baseURL + config.url) { // 在当前请求在数组中存在时执行取消函数
      pending[i].f() // 执行取消操作
    } else {
      pending[i].url = pending[i]
    }
  }
}
// http request 拦截器
service.interceptors.request.use(config => {
  removePending(config) // 在一个axios发送前执行一下判定操作，在removePending中执行取消操作，因为axios请求是异步请求，当请求过快（操作过快）时返回的数据就无法确定是哪个请求（操作）之后响应的数据了，取消操作保证请求的数据永远是最新的
  config.cancelToken = new cancelToken(function executor (c) { // 本次axios请求的配置添加cancelToken，这个参数 c 就是CancelToken构造函数里面自带的取消请求的函数，这里把该函数当参数用
    pending.push({
    	  // url: config.url,
    	  url: axios.defaults.baseURL + config.url,
    	  f: c
    })
    // console.log(axios.defaults.baseURL+config.url);
    // 将本次的url添加到pending中，因此对于某个url第一次发起的请求不会被取消，因为还没有配置取消函数
  })
  if (config.method === 'get') {
    // console.log(...config.params,'config.params')
    config.params = {
      // t: Date.parse(new Date()) / 1000,
    	t: new Date().getTime(),  //判断是否是get请求，如果是get请求，则参数前面加上t(实时时间)
        
      ...config.params
    }
  }
  return config
}, error => {
  return Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(
  (response) => {
    removePending(response.config) // 在一个axios响应后再执行一下取消操作，把已经完成的请求从pending中移除
    if (response.data.code == 5) {
      		Message.loading({
      			 content: '自动跳转登录页面 ',
      			 duration: 2,
      			 onClose () {
      				window.location.href = '/login'
      			}
      		 })
    }
    if (response.data.code != 0) {
      Message.error(response.data.message)
      return response.data
    }
    return response.data
  },
  (error) => {
    if (error.response) {
      switch (error.response.status) {
        case 401:
          Message.destroy()
          Message.loading({
            content: '自动跳转登录页面 ',
            duration: 0.1,
            onClose () {
              window.location.href = '/login'
            }
          })
        case 404:
          Message.error('找不到该页面!')
          return
        case 500:
          Message.error('内部服务器错误!')
      }
      return Promise.reject(error.response.statusText)
    }
  }
)

export default service
